package com.example.wan1.view.home;

import android.annotation.SuppressLint;
import android.util.Log;

import com.example.wan1.base.mvp.BasePresenter;
import com.example.wan1.data.BaseObserver;
import com.example.wan1.data.RetrofitUtil;
import com.example.wan1.data.RootObserver;
import com.example.wan1.data.RxSchedulers;
import com.example.wan1.model.ArticleBean;
import com.example.wan1.model.BannerBean;
import com.example.wan1.model.common.CommonResList;

import java.util.List;

import javax.inject.Inject;

import io.reactivex.Observable;

/***
 * 创建时间：2020/6/30 7:12
 * 创建人：10850
 * 功能描述：文章 P层
 * 需要封装成一个通用的baseObserver，不带common部分的
 *
 * 1.这里使用的concatWith操作符相当于1+1=2，发送2个事件，一个4，一个19.。。这里应该是合并成一个事件进行发送
 * 2.上拉刷新不需要getView().showLoading();。。。
 */
public class ArticlePresenter implements ArticleContract.Presenter {

    @Inject
    ArticleContract.View mView;

    @Inject
    public ArticlePresenter() {

    }

    /***
     * 启动界面时的方法
     */
    @SuppressLint("CheckResult")
    public void start() {
        //Log.i("zxd", "start: 最新文章");
        if (mView == null) return;
        //文章列表
        Observable<List<ArticleBean>> ArticleListO1 = RetrofitUtil.getInstance().getArticleList(0)
                .map(commonResListCommonResBody -> commonResListCommonResBody.getData().getDatas());
        //置顶文章列表
        Observable<List<ArticleBean>> ArticleListO2 = RetrofitUtil.getInstance().getArticleTopList()
                .map(listCommonResBody -> listCommonResBody.getData());
        Observable.zip(ArticleListO2, ArticleListO1, (articleBeans, articleBeans2) -> {
            articleBeans.addAll(articleBeans2);
            return articleBeans;
        }).compose(RxSchedulers.observableIO2Main())
                .subscribe(new RootObserver<ArticleBean>() {
                    @Override
                    public void onSuccess(List<ArticleBean> result) {
                        mView.onSuccessArticle(result);
                        //getBannerList();
                    }

                    @Override
                    public void onFailure(Throwable e, String errorMsg) {
                        mView.onFailure(e.getMessage());
                    }
                });
        getBannerList();//可能是必须得有先后顺序才行吧。延迟处理~~
        //注意：不是一定得延迟才能解决这个问题
        //问题的原因是 两个网络请求在 请求失败后 都会添加失败的布局，导致点击重新加载后，不会消失。因为添加了两次
        //解决办法：第一个是网络请求这里控制下，onFailure只允许调用一次
        //第二个办法是延迟加载，把getBannerList();放到onSuccess中
    }

    public void refresh() {
        //文章列表
        Observable<List<ArticleBean>> ArticleListO1 = RetrofitUtil.getInstance().getArticleList(0)
                .map(commonResListCommonResBody -> commonResListCommonResBody.getData().getDatas());
        //置顶文章列表
        Observable<List<ArticleBean>> ArticleListO2 = RetrofitUtil.getInstance().getArticleTopList()
                .map(listCommonResBody -> listCommonResBody.getData());

        Observable.zip(ArticleListO2, ArticleListO1, (articleBeans, articleBeans2) -> {
            articleBeans.addAll(articleBeans2);
            return articleBeans;
        }).compose(RxSchedulers.observableIO2Main())
                .subscribe(new RootObserver<ArticleBean>() {
                    @Override
                    public void onSuccess(List<ArticleBean> result) {
                        mView.onSuccessArticle(result);
                    }

                    @Override
                    public void onFailure(Throwable e, String errorMsg) {
                        mView.onFailure(e.getMessage());
                    }
                });
        getBannerList();
    }

    @Override
    public void getArticleList(int page) {
        RetrofitUtil.getInstance().getArticleList(page)
                .compose(RxSchedulers.observableIO2Main())
                .subscribe(new BaseObserver<CommonResList<ArticleBean>>() {
                    @Override
                    public void onSuccess(CommonResList<ArticleBean> result) {
                        mView.onSuccess(result);
                    }

                    @Override
                    public void onFailure(Throwable e, String errorMsg) {
                        mView.onFailure(e.getMessage());
                    }
                });
    }

    @Override
    public void getBannerList() {
        RetrofitUtil.getInstance().getBannerList()
                .compose(RxSchedulers.observableIO2Main())
                .subscribe(new BaseObserver<List<BannerBean>>() {
                    @Override
                    public void onSuccess(List<BannerBean> result) {
                        mView.onSuccessBanner(result);
                    }

                    @Override
                    public void onFailure(Throwable e, String errorMsg) {
                        //mView.onFailure(e.getMessage());
                    }
                });
    }
}
